package net.bingosoft.common.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import net.bingosoft.common.config.Config;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
/**
 * 2007-9-5 上午09:26:43
 * Author:yangdongyu(yangdy@bingosoft.net)
 * ReadMe:Ftp 文件上传、下载的工具类
 * ChangeLog:
 */
public class FTPUtil{
	private static final Log log = LogFactory.getLog(FTPUtil.class);
	private FtpClient ftpClient;
	//FTP服务器IP
	private   String   serverIP   =   Config.getString("ftp.server_ip","127.0.0.1");
	//FTP用户名字
	private   String   userName   =   Config.getString("ftp.server_user","anonymous");
	//FTP密码 
	private   String   password   =   Config.getString("ftp.server_password",""); 
	//FTP文件的存放目录
	private   String   fileDir    =    Config.getString("ftp.server_file_path","");  
	/**
	 * 建立与服务器的链接
	 * @param serverIP
	 * @param user 用户名
	 * @param password 密码
	 * @param path 文件夹路径
	 */
	public void connect(String serverIP,String user,
			String password,String path){ 
		try{ 
			ftpClient=new FtpClient(serverIP); 
			ftpClient.login(user, password); 
			log.debug("成功连接服务器 ：" + ftpClient.welcomeMsg); 			
			if (StringUtils.isNotEmpty(path)) {
				ftpClient.cd(path);
			}
			ftpClient.binary(); 
		}catch (IOException ex) { 
			log.debug("连接服务器失败...",ex);
		} 
	}
	/**
	 * 通过读取配置文件中的信息建立一条FTP连接
	 */
	public void connect(){ 
		try{ 
			ftpClient=new FtpClient(serverIP); 
			ftpClient.login(userName, password); 
			log.debug("成功连接服务器 ：" + ftpClient.welcomeMsg); 			
			if (StringUtils.isNotEmpty(fileDir)) {
				ftpClient.cd(fileDir);
			}
			ftpClient.binary(); 
		}catch (IOException ex) { 
			log.debug("连接服务器失败...",ex);
		} 
	}

	/**
	 * 关闭与ftp服务器的连接。
	 *
	 */
	public void release(){ 
		try{
			if(ftpClient != null){
				ftpClient.closeServer();
				log.debug("成功释放连接...");	
			}
		}catch (IOException ex){ 	
			log.error("释放链接失败...",ex); 
		} 
	} 

	/**
	 * 上传指定的文件到指定的服务器
	 * @param srcFile
	 * @param destFile
	 */
	public void upload(String srcFile,String destFile){  
		try {
			if(ftpClient == null || !ftpClient.serverIsOpen()){
				log.error("服务器连接不可用...");
				return ;
			}
			TelnetOutputStream os= ftpClient.put(destFile); 
			File file_in=new File(srcFile); 
			if (file_in.length()==0) {
				log.warn("上传文件为空!");
			}else{
				log.info("上传文件大小为: " + file_in.length());
			}
			FileInputStream is=new FileInputStream(file_in); 
			byte[] bytes=new byte[1024]; 
			int c; 
			while ((c=is.read(bytes))!=-1){		
				os.write(bytes,0,c);		
			} 
			is.close(); 
			os.close(); 
			log.debug("成功将文件" + srcFile + "上传至文件服务器...");
		}catch (IOException ex) {	
			log.error("上传文件失败...",ex); 
		} 	 
	}
	/** 
	 * 从文件服务器下载文件到本地
	 * @throws java.lang.Exception 
	 * @return  
	 * @param localFileName 本地生成的文件名 
	 * @param serverFileName 服务器上的文件名 
	 */ 
	public void download(String serverFileName,String localFileName) throws Exception{   
		log.debug("准备下载文件：" + serverFileName + "至" + localFileName);
		TelnetInputStream is = null; 
		try{ 
			is = ftpClient.get(serverFileName);
			FileHelper.createFile(localFileName, is);
			log.debug("下载文件成功...");
		} catch (IOException e){ 
			log.error("下载文件失败...",e);
		} 
	}
	/**
	 * 获取服务器上的文件列表
	 * @param path
	 * @return
	 */
	public List<String> getFileList(String path){ 
		List<String> fileNameList = new ArrayList<String>(); 
		try{ 
			BufferedReader bis = new BufferedReader(new InputStreamReader(ftpClient.nameList(path))); 
			String filename = ""; 
			while((filename=bis.readLine())!=null){
				if(filename != null && filename.trim().length() > 0){
					log.debug(filename);
					fileNameList.add(filename);	
				}
			}   
		} catch (Exception e){ 
			log.error("获取文件列表失败"); 
		} 
		return fileNameList; 
	}

}
